package com.cskaoyan.javase.oop2._1extends._4hierarchy;

/**
 * 思考:
 * 1.Java中的一个类,可以直接使用extends声明继承多个class吗?
 * 注意 Java中的一个类是不可以直接继承多个类的,只能直接继承一个类
 * 像Java这种，只能有一个直接父类，而不能有两个或更多的设计
 *      称之为"单重继承"或者"单继承"。
 *
 * 而像C++当中，一个类可以直接继承多个类，就称之为"多重继承"或者"多继承"。
 *
 * 2.Java中的一个,就只有一个父类吗?
 * 不是,显然不是,因为父类可能还有父类,那么父类的父类就是子类的间接父类
 * 于是就形成了下面几个概念：
 *      1.祖先类：处在继承顶层的类。
 *      2.继承层次（hierarchy）：由某个祖先类派生出来的所有类的集合叫做继承层次。
 *      3.继承链：从某一个子类开始，到其祖先类的路径。
 *
 * 继承层次中需要注意的地方：
 * 1.在一条继承链中，总称呼下游类是上游类的子类，不管隔了几层。没有孙子类或者重孙类这种概念。
 * 2.在一条继承链中的，下游的类总是继承上游类的所有成员，不管隔了几层。
 * 3.在一条继承链中，下游类总可以看成一个上游类，存在"is-a"关系。
 * 4.不在同一条继承链中的类，没有任何关系。虽然看起来像"兄弟姐妹"类，但是Java是不讲究血统的。
 * 解释:
 * a.因为一方面，子类可以自由扩展功能；
 * b.另一方面，继承来的东西也是可以修改的。
 * 所以"兄弟姐妹"可能完全和"我"不同，没有任何关系。
 *
 * 5.不能循环定义继承。比如A继承B，B继承C，再让C来继承A，这是不行的。
 * 6.继承链可以无限延伸下去，但是一般来说有个5~6层继承，已经很多了。
 *
 * 除此之外再补充一个知识点:
 *      Java类设计体系中的祖先类,最顶层的类是Object类
 *      Java中的每一个类包括数组,都继承了Object类
 *      这个继承可以是直接继承: 当Java中一个类没有显式的使用"extends"关键字去直接继承某个类时,那么它就直接继承Object
 *      这个继承也可以是间接继承: 当Java中一个类显式的使用"extends"关键字去直接继承某个类时,那么它的间接父类总究会继承Object.
 *      Java中所有的类创建的对象,都可以使用Object类当中的方法.
 *
 * @since 16:10
 * @author wuguidong@cskaoyan.onaliyun.com
 */
// Class 'Demo' explicitly extends 'java.lang.Object'
public class Demo extends Object{
    public static void main(String[] args) {
        Grandson gs = new Grandson();
        gs.testSon();
        gs.testGrandfather();
        gs.testSon();
        gs.testGrandson();
        /*
            在本案例中
            创建Grandson对象
            可以用哪些引用指向呢?
         */
        Grandfather gf = new Grandson();
        Father f = new Grandson();
        Son s = new Grandson();
        Grandson gs2 = new Grandson();
    }
}

// Cyclic inheritance involving 'com.cskaoyan.javase.oop2._1extends._4hierarchy.Grandfather'
// 不能循环定义继承
class Grandfather{
    public void testGrandfather() {
    }
}

// Uncle类和Grandson类就不是在一条继承链当中了
class Uncle extends Grandfather {
    public void testUncle() {
    }
}

class Father extends Grandfather {
    public void testFather() {
    }

}

class Son extends Father {
    public void testSon() {
    }

}

class Grandson extends Son {
    public void testGrandson() {
    }

}

/*class Father2 {
}*/
// Class cannot extend multiple classes
/*
class Son extends Father, Father2 {

}*/
